package com.bite.springmvc.controller;

import com.bite.springmvc.model.UserInfo;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/request")
@RestController
public class RequestController {
    //传递 单个参数
    @RequestMapping("/param1")
    public String param1(String userName) {
        System.out.println("接收到参数：" + userName);
        return "接收到参数：" + userName;
    }

    @RequestMapping("/param2")
    public String param2(Integer age) {
        return "2接收到参数：" + age;
    }

    @RequestMapping("/param3")
    public String param3(int age) {
        return "3接收到参数：" + age;
    }

    @RequestMapping("/param4")
    public String param4(String userName, String password) {
        System.out.println("接收到参数：" + userName);
        return "接收到参数userName：" + userName + ",password：" + password;
    }

    //参数较多的时候，方法声明就需要很多参数
    //把这些参数封装成一个对象，传递对象
    @RequestMapping("/param5")
    public String param5(UserInfo userInfo) {
        return "接收到参数：" + userInfo.toString();
    }

    //参数重命名
    //默认是必传参数
    //可以 将required == false 这时就是非必传
    @RequestMapping("/param6")
    public String param6(@RequestParam("userName") String name, String password) {
        return "接收到参数name：" + name + ",password：" + password;
    }

    //传递数组
    @RequestMapping("/param7")
    public String param7(String[] arrParams) {
        //Arrays.toString(arrParams) 将数组转换为字符串
        return "接收到参数arrParams：" + Arrays.toString(arrParams);
    }

    //传递集合
    @RequestMapping("/param8")
    //注解 @requestparam  请求参数
    //使用 @RequestParam 注解的主要目的是为了将请求中的参数绑定到方法的参数上
    public String param8(@RequestParam("listParam") List<String> listParam) {
        return "接收到参数arrParams：" + listParam;
    }

    //JSON
    //前端传递数据的时候 传递的是 JSON 字符串
    //但是到达后端的时候想要 得到的是一个对象
    //这个时候需要用 @RequestBody 注解进行转换
    @RequestMapping("/param9")
    public String param9(@RequestBody UserInfo userInfo) {
        return "接收到参数userInfo：" + userInfo;
    }

    @RequestMapping("/param10/{articleId}")
    //用于在处理 HTTP 请求时，从 URL 路径中提取变量并将其绑定到方法的参数上。它
    //常用于 RESTful Web 服务中，以便从请求的 URI 中获取动态数据。
    public String param10(@PathVariable("articleId") Integer articleId) {
        return "接收到参数articleId：" + articleId;
    }

    @RequestMapping("/param11/{id}/{name}")
    //用于在处理 HTTP 请求时，从 URL 路径中提取变量并将其绑定到方法的参数上。它
    //常用于 RESTful Web 服务中，以便从请求的 URI 中获取动态数据。
    public String param10(@PathVariable("id") Integer id, @PathVariable("name") String name) {
        return "接收到参数id：" + id + "，name:" + name;
    }

    //上传文件
    @RequestMapping("/param12")
    //重要
    //用于处理 multipart/form-data 类型的请求，
    //通常用于文件上传或表单数据的提交。它允许你从 HTTP 请求中提取特定部分的数据。
    public String param12(@RequestPart("file") MultipartFile file) throws IOException {
        System.out.println(file.getName());
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("D:/img/" + file.getOriginalFilename()));
        return "接收到参数id：" + file.getOriginalFilename();
    }

    //用最原始的方式获取 cookie
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request) {
        //得到的是一个cookie数组
        Cookie[] cookies = request.getCookies();
        System.out.println("获取Cookie信息：");
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        }
        return "获取Cookie成功";
    }

    //从Cookie中获取单个值
    @RequestMapping("/getCookie2")
    //@CookieValue("bite")表示从请求的Cookie中提取名为bite的Cookie。
    //如果该Cookie不存在，Spring会抛出异常，除非你设置了required=false。
    public String getCookie2(@CookieValue("bite") String bite) {
        System.out.println("从Cookie中获取 bite：" + bite);
        return "获取Cookie成功";
    }


    //用传统方式设置 Session
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request) {
        //参数 为true 如果session对象不存在，则创建一个session，如果存在，则直接返回
        HttpSession session = request.getSession(true);
        session.setAttribute("name","zhangsan");
        session.setAttribute("studentId","10086");
        return "设置Session成功";
    }

    //用原始方式获取session
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        //参数为false  不存在session, 返回null
        HttpSession session = request.getSession(false);
        if (session != null){
            System.out.println(session.getAttribute("name"));
            System.out.println(session.getAttribute("studentId"));
        }
        return "获取Session成功";
    }


    @RequestMapping("/getSession2")
    public String getSession2(HttpSession session) {
//        session = request.getSession();
        System.out.println("name:" + session.getAttribute("name"));
        System.out.println("studentId:" + session.getAttribute("studentId"));
        return "获取Session成功";
    }

    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute(value = "name",required = false) String name) {
        System.out.println("name：" + name);
        return "获取Session成功";
    }

    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        return "User-Agent:" + userAgent;
    }

    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent) {
        return "User-Agent:" + userAgent;
    }



}
